package com.ccc.netty.client.splitpacket;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

public class SplitpacketNettyClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当客户端连接服务器完成就会触发该方法
     *
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/666.jpg");
        byte[] bytes = new byte[0];
        try {
            bytes = IOUtils.toByteArray(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        /**
         起始标识符          4
         报文头	消息类型    4
         消息长度    4
         消息序列号   4
         报文体	数据体      n
         */
        ByteBuffer byteBuffer = ByteBuffer.allocate(16 + bytes.length);
        byteBuffer
                .put("XATX".getBytes(CharsetUtil.UTF_8)) // 起始标识符
                .putInt(1) // 消息类型
                .putInt(bytes.length) // 消息长度
                .putInt(0) // 消息序列号
                .put(bytes); // 数据体

        ByteBuf buf = Unpooled.copiedBuffer(byteBuffer.array());
        System.out.println("发送消息内容长度为：" + buf.array().length);
        ctx.writeAndFlush(buf);
    }

    /**
     * 当通道有读取事件时会触发，即服务端发送数据给客户端
     *
     * @param ctx
     * @param msg
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ByteBuf buf = (ByteBuf) msg;
        System.out.println("收到服务端的消息:" + buf.toString(CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}